package com.grp6.game.model;

import java.util.List;

import com.grp6.game.common.IObservable;
import com.grp6.game.common.InvalidMoveException;
import com.grp6.game.player.IPlayer;
import com.grp6.game.view.IView;

/**
 * This interface represents the board game and the game elements. 
 * It returns players, game boards, and notify invalid move to controller.
 * @author Group6
 */
public interface IGameModel<V extends IView> extends IObservable{
	
	/**
	 * Notifies the lifecycle about the exception
	 * @param InvalidMoveException exception
	 */
	void notifyInvalidMove(InvalidMoveException e);
	
	/**
	 * Returns the list of players in the game
	 * @return List of Player objects
	 */
	<P extends IPlayer> List<P> getPlayers();
	
	/**
	 * Returns the GameBoard to the Model
	 * @return GameBoard object
	 */
	IGameBoard<V> getGameBoard();
}
